iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0

鐵人第28天,這篇是雜記PowerShell仿Linux Command一些小筆記,說起來PowerShell借鑑了Perl的最重要的變數$_,上手相對快。如後面範例中,找出超過三天的Log並刪除,在取得每個檔案最後修改時間就用了$_變數。

Mac版PowerShell

首先本機是用Mac開發,是可以透過brew安裝PowerShell,最初安裝到PowerShell 6,在MacOS升到10.13以上,才能升到PowerShell 7,而這兩個版本在Mac路徑也不同。
6的路徑為:/usr/local/microsoft/powershell/6.0.0-beta.5/powershell,指令為powershell
7的路徑為:/usr/local/microsoft/powershell/7/pwsh,指令是pwsh,就很符合Linux對sh的命名習慣。

單行指令飯粒

找出超過三天的Log並刪除

Get-ChildItem –Path "C:\apache-tomcat-9.0.0.M21\logs" -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-3))} | Remove-Item

檢查磁碟IO

Get-WmiObject Win32_Process | Select-Object ProcessId, Name, @{Name="ReadOperationCount";Expression={$_.ReadOperationCount}}, @{Name="WriteOperationCount";Expression={$_.WriteOperationCount}}

檢查某個Process何時啟動

下例用outlook去查:

New-TimeSpan -Start (get-process "outlook").StartTime

比對兩個目錄的差異

$fso = Get-ChildItem -Recurse -path C:\fso
$fsoBU = Get-ChildItem -Recurse -path C:\fso_BackUp
Compare-Object -ReferenceObject $fso -DifferenceObject $fsoBU

仿Linux的tail -f指令

Get-Content -Path "D:\a.log" -Wait -Tail 10

-Wait參數其實就做到了,但若不設-Tail來顯示尾十筆,假設log檔很大,從頭down到尾的時間要花很久。

在JBoss的standalone.xml增加enabled-protocol屬性來設定TLS

$standalone = [xml](Get-Content .\standalone.xml)
$standalone.server.profile.subsystem.server."https-listener".setAttribute("enabled-protocols", "TLSv1.2,TLSv1.3")
$standalone.Save("C:\JBoss\sttandalone\configuration\standalone.xml")

移除Cortana

Cortana是Windows 10、11的語音智慧助理,但在公司電腦上常是礙事的跳出錯誤視窗。所以一勞永逸的移除作法是用PowerShell指令

PS C:\WINDOWS\system32> Get-AppxPackage -allusers Microsoft.549981C3F5F10 | Remove-AppxPackage
PS C:\WINDOWS\system32> Get-appxPackage -allusers Microsoft.549981C3F5F10 | Remove-AppxPackage

兩道指令一模一樣,差在Get-AppxPackage和Get-appxPackage有個A分大小寫

設定環境變數

無法像DOS一樣用set ROOT=.。而是類似Perl作法

$env:ROOT = ‘.’

值的部份要用單引號或雙引號括起。

掃瞄特定目錄下所有檔案包括子目錄下的關鍵字

GCI D:\Tomcat\* -Recurse | Select-String "dummy"
# 或者
Get-ChildItem D:\Tomcat\* -Recurse | Select-String -Pattern "dummy"
  • Get-ChildItem可以簡寫成GCI
  • -Recurse是遞迴,根據前的目錄的filter是*,亦即全部都掃瞄。
  • Select-String作用如同DOS的findstr,搞不懂為何要分兩個。
  • -Pattern可以省略,預設搜固定字串。帶-Pattern應該是指要支援Regex

對指定目錄下的檔案批次替換字串

Get-ChildItem ‘D:\Temp\*.log’ -Recurse | ForEach { (Get-Content -Encoding UTF8 $_ | ForEach { $_ -replace ‘old’, ‘new’}) | Set-Content -Encoding UTF8 $_ }

上一篇
Windows版的kill -9
下一篇
壓箱寶:PowerShell雙帳密過版
系列文
作業系統的專武30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言